#include <iostream>
#include "../../ArbolB+/ArbolBMas.h"

#include <../lib/igloo/igloo.h>

using namespace std;
using namespace igloo;
using namespace Arboles;

Context(arbolBMasTestBajaEnRaiz)
{

	ArbolBMas* arbol;
	string path;
	Configuracion* config;

	void SetUp() {
		config = Configuracion::getInstancia("archivoConfiguracionTestArbol.txt");
		arbol = new ArbolBMas("TestBaja");
	}

	void TearDown() {
		string path = config->getPathArbol() + "arbol" + "TestBaja" + ".bin";
		remove(path.c_str());
		string pathNodosLibres = config->getPathArbol() + "nodosLibres" + "TestBaja" + ".bin";
		remove(pathNodosLibres.c_str());
		delete config;
		delete arbol;
	}



	Spec(borrarEnRaizOffsets) {

		arbol->insertar("241011Caba", 99);
		arbol->insertar("241011Caba", 98);
		arbol->insertar("241011Caba", 105);
		arbol->insertar("241011Caba", 10);

		arbol->suprimir("241011Caba", 98);
		arbol->suprimir("241011Caba", 10);

		NodoHoja* raiz = new NodoHoja(0, 0, 160);
		raiz->setNumeroNodo(0);
		arbol->getNodo(raiz);

		Assert::That(raiz->getRegistros()->size(), Is().EqualTo(1));
		Assert::That(raiz->getRegistros()->at(0)->getClave(), Is().EqualTo("241011Caba"));
		Assert::That(raiz->getRegistros()->at(0)->getOffsets()->size(), Is().EqualTo(2));
		Assert::That(raiz->getRegistros()->at(0)->getOffsets()->at(0), Is().EqualTo(99));
		Assert::That(raiz->getRegistros()->at(0)->getOffsets()->at(1), Is().EqualTo(105));

		delete raiz;
	}

	Spec(borrarEnRaizClave) {

		arbol->insertar("241011Caba", 99);
		arbol->insertar("241011Caba", 98);
		arbol->insertar("241011Caba", 105);
		arbol->insertar("241011Caba", 10);

		arbol->suprimir("241011Caba", 99);
		arbol->suprimir("241011Caba", 98);
		arbol->suprimir("241011Caba", 105);
		arbol->suprimir("241011Caba", 10);

		NodoHoja* raiz = new NodoHoja(0, 0, 160);
		raiz->setNumeroNodo(0);
		arbol->getNodo(raiz);

		Assert::That(raiz->getRegistros()->size(), Is().EqualTo(0));

		delete raiz;
	}

	Context(arbolBMasTestBajaEnHoja) {

		ArbolBMas* arbol;

		void SetUp() {

		arbol = (Parent().arbol);

		arbol->insertar("241011Caba", 34);
		arbol->insertar("241011Rosa", 56);
		arbol->insertar("241011Cord", 78);
		arbol->insertar("241011Salt", 100);
		arbol->insertar("241011Tasa", 122);
		arbol->insertar("241011Trel", 144);
		arbol->insertar("241011Zumu", 166);

		/* Queda:
		 * Nodo raiz: 2 | 241011Tasa | 1
		 *		   2: 241011Caba,34 | 241011Cord,78 | 241011Rosa,56 | 241011Salt,100
		 *		   1: 241011Tasa,122 | 241011Trel,144 | 241011Zumu,166
		 */
	}

		Spec(bajaEnHoja) {

			NodoHoja* hojaAntes = new NodoHoja(0, 0, 160);
			hojaAntes->setNumeroNodo(1);

			arbol->getNodo(hojaAntes);
			Assert::That(hojaAntes->getRegistros()->size(), Is().EqualTo(3));

			arbol->suprimir("241011Trel", 144);

			NodoHoja* hojaDespues = new NodoHoja(0, 0, 160);
			hojaDespues->setNumeroNodo(1);
			arbol->getNodo(hojaDespues);
			Assert::That(hojaDespues->getRegistros()->size(), Is().EqualTo(2));

			delete hojaAntes;
			delete hojaDespues;
		}

		Spec(bajaEnHojaConBalanceo) {

			NodoHoja* hojaAntes = new NodoHoja(0, 0, 160);
			hojaAntes->setNumeroNodo(1);

			arbol->getNodo(hojaAntes);

			Assert::That(hojaAntes->getRegistros()->size(), Is().EqualTo(3));

			arbol->suprimir("241011Tasa", 122);
			arbol->suprimir("241011Trel", 144);
			arbol->suprimir("241011Zumu", 166);

			/* Queda:
			 * Nodo raiz: 2 | 241011Rosa | 1
			 *		   2: 241011Caba,34 | 241011Cord,78 |
			 *		   1: 241011Rosa,56 | 241011Salt,100
			 */

			NodoHoja* hojaIzquierdaDespues = new NodoHoja(0, 0, 160);
			hojaIzquierdaDespues->setNumeroNodo(2);
			arbol->getNodo(hojaIzquierdaDespues);
			Assert::That(hojaIzquierdaDespues->getRegistros()->size(), Is().EqualTo(2));
			Assert::That(hojaIzquierdaDespues->getRegistros()->at(0)->getClave(), Is().EqualTo("241011Caba"));
			Assert::That(hojaIzquierdaDespues->getRegistros()->at(1)->getClave(), Is().EqualTo("241011Cord"));

			NodoHoja* hojaDerechaDespues = new NodoHoja(0, 0, 160);
			hojaDerechaDespues->setNumeroNodo(1);
			arbol->getNodo(hojaDerechaDespues);
			Assert::That(hojaDerechaDespues->getRegistros()->size(), Is().EqualTo(2));
			Assert::That(hojaDerechaDespues->getRegistros()->at(0)->getClave(), Is().EqualTo("241011Rosa"));
			Assert::That(hojaDerechaDespues->getRegistros()->at(1)->getClave(), Is().EqualTo("241011Salt"));

			NodoInterno* raiz = new NodoInterno(0, 160);
			raiz->setNumeroNodo(0);
			arbol->getNodo(raiz);
			Assert::That(raiz->getRegistros()->size(), Is().EqualTo(1));
			Assert::That(raiz->getRegistros()->at(0)->getClave(), Is().EqualTo("241011Rosa"));

			delete raiz;
			delete hojaAntes;
			delete hojaIzquierdaDespues;
			delete hojaDerechaDespues;
		}
	};
};
